/*
 * Copyright 2016-2018 the original author or authors.
 * Created on 2018/7/10 下午10:11
 */
package com.gitee.mechanic.wechat.utils;

import com.fasterxml.jackson.databind.JavaType;
import com.gitee.mechanic.core.utils.EncodeUtil;
import com.gitee.mechanic.core.utils.HashUtil;
import com.gitee.mechanic.json.mapper.XmlMapper;
import com.google.common.collect.Maps;

import java.io.InputStream;
import java.util.Arrays;
import java.util.Map;

/**
 * 请在此写下该类的说明
 *
 * @author phil
 * @version 1.0.0
 */
public class MpSignatureUtils {
    /**
     * 服务号签名验证
     * @param signature 微信加密签名。signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
     * @param timestamp 时间戳
     * @param nonce     随机数
     * @return 验证是否成功
     */
    public static boolean signature(String signature, String timestamp, String nonce,String token) {

        String[] arr = {token, timestamp, nonce};
        Arrays.sort(arr);

        StringBuilder sb = new StringBuilder();
        for (String s : arr) {
            sb.append(s);
        }

        String encrpt = EncodeUtil.encodeHex(HashUtil.sha1(sb.toString()));

        // 确认请求来至微信
        return encrpt.equalsIgnoreCase(signature);
    }

    /**
     * 获取微信回调解析成map
     * @param inputStream
     * @return
     */
    public static Map getCallbackMessage(InputStream inputStream) {

        XmlMapper xmlMapper = new XmlMapper();
        JavaType javaType = xmlMapper.buildType(Map.class, String.class, String.class);

        Map<String, String> map = Maps.newHashMap();
        map = xmlMapper.fromXml(inputStream, javaType);

//        //将解析的结果存储在hashmap中
//        Map<String, String> map = new HashMap<String, String>();
//        //读取输入流
//        SAXReader reader = new SAXReader();
//        org.dom4j.Document document = null;
//        try {
//            document = reader.read(inputStream);
//        } catch (DocumentException e) {
//            e.printStackTrace();
//        }
//
//        //得到xml元素
//        org.dom4j.Element root = document.getRootElement();
//        //得到所有根元素的所有子节点
//        List<org.dom4j.Element> elementList = root.elements();
//        //遍历所有子节点
//        for (org.dom4j.Element e : elementList) {
//            map.put(e.getName(), e.getText());
//        }
//        //释放资源
//        try {
//            inputStream.close();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        inputStream = null;
        return map;
    }
}
